package top.ddandang.blog.mapper;

import top.ddandang.blog.model.pojo.Article;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import top.ddandang.blog.model.pojo.Tags;
import top.ddandang.blog.model.vo.ArticleDetailVo;
import top.ddandang.blog.model.vo.ClassificationVo;
import top.ddandang.blog.model.vo.IndexVo;
import top.ddandang.blog.model.vo.ManageVo;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author D
 * @since 2020-06-23
 */
public interface ArticleMapper extends BaseMapper<Article> {

    /**
     * 获取首页的文章数据(先按置顶排序，然后按照时间降序)
     * @param map 动态SQL 如果map中存在categoryId则按照分类获取文章  存在tagsId则按照标签获取文章
     * @return 首页文章数据
     */
    List<IndexVo> listArticleMap(Map<String, Object> map);

    /**
     * 根据标签获取首页的文章数据(先按置顶排序，然后按照时间降序)
     * @param tagsId tagsId则按照标签获取文章
     * @return 首页文章数据
     */
    List<IndexVo> listArticleMapByTags(Integer tagsId);

    /**
     * 获取文章的总数
     * @return 文章的总数
     */
    @Select("select count(id) from article where deleted = 0")
    int getArticleCount();

    /**
     * 获取文章的详细
     * @param id 文章Id
     * @return 文章详细信息
     */
    ArticleDetailVo getTagsByArticleId(int id);

    /**
     * 根据分类Id获取分类中展示文章的内容
     * @param categoryId 分类ID
     * @return 文章内容 包含Id 标题 和简要描述
     */
    @Select("SELECT a.id, a.title, a.description FROM article a, categories c " +
            "WHERE a.categories = c.id AND c.id = #{categoryId}")
    List<ClassificationVo> listClassificationVoByCategoryId(Integer categoryId);

    /**
     * 根据标签Id获取分类中展示文章的内容
     * @param tagsId 标签Id
     * @return 文章内容 包含Id 标题 和简要描述
     */
    @Select("SELECT a.id, a.title, a.description FROM article a, article_tags a_t, tags t " +
            "WHERE t.id = a_t.tags_id AND a_t.article_id = a.id AND t.id = #{tagsId}")
    List<ClassificationVo> listClassificationVoByTagsId(Integer tagsId);

    /**
     * 查询出分类为null的文章
     * @return ClassificationVo Array List
     */
    @Select("SELECT * FROM `article` WHERE categories IS null")
    List<ClassificationVo> listArticleCategoryIsNull();

    /**
     * 给未分类的文章增加分类
     * @param map 有categoryId 分类id 和 articleId数组
     */
    void addArticleCategory(Map<String, Object> map);

    /**
     * 通过id获取文章的详细信息
     * @param id 文章的id
     * @return 文章的详细信息
     */
    ArticleDetailVo getArticleDetailVoById(Integer id);

    /**
     * 获取管理页面的文章疯转的信息
     * @param map categoryId 筛选的分类ID allowComment 是否允许评论
     * @return 文章信息
     */
    List<ManageVo> listManageVo(Map<String, Object> map);

    /**
     * 根据文章Id获取标签
     * @param id 文章Id
     * @return 文章属于的标签
     */
    List<Tags> getTagsNameByArticleId(Integer id);
}
